package com.hxrk.cecardvr;

import org.opencv.core.Mat;

import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 缓冲池
 */
public class BufferPool {
    private static final int BUFFER_SIZE = 2 * 1024 * 1024;        //缓冲包2M

    private static final int BUFFER_MAX_NUM = 20;                    //缓冲池保留最大数量
    private static final ConcurrentLinkedQueue<Mat> buffers = new ConcurrentLinkedQueue<Mat>();

    private static AtomicInteger countCreated = new AtomicInteger(0);    //已创建的缓冲包个数

    /**
     * 分配
     */
    public static Mat allocate() {
        Mat result = buffers.poll();
        //创建新缓冲包
        if (result == null) {
            result = new Mat();

            //记录创建个数
            int count = countCreated.incrementAndGet();

            //日志
            if (count <= BUFFER_MAX_NUM) {
                LogUtils.d("创建新的BufferPool缓冲池，已创建总数量：count= " + count);
            } else {
                LogUtils.d("创建新的BufferPool缓冲池，已创建总数量：count= " + count);
            }
        }
        return result;
    }

    /**
     * 回收
     *
     * @param buff
     */
    public static void deallocate(Mat mat) {
        //缓冲池已达上限
        if (buffers.size() >= BUFFER_MAX_NUM) return;

        //加回到池中
        buffers.add(mat);
    }
}